expect + ssh + tail で嵌った話


概要

expect を人から薦めてもらう機会があったので、やりたいこと一つ叶えてみてた。


sshでサーバに入って特定の語句を捉えてなんかする、、的なことが出来るので、

sshで入ってtailしたサーバのファイル更新内容をローカルへの標準入力に吐き出すみたいなのを作った。

EnteringOrbit

https://github.com/sassembla/EnteringOrbit/tree/master



困った事

expectでのssh後に素直にexpectでいろんなトラブルを待って、解消したらあきらめるとかtailするとかで良いと思ってたんだけど、

expect + ssh + tail なのがどうも良く無い。

予定だと、sshでログイン後に実行するのがtailで、これは本来は勝手には終了しないはずなのに、

expectコマンドで使うとtailでロックせずすっぽ抜けて、expectそのものが終了してしまう。


→(本来なら、tailは成立した瞬間からファイルの更新シグナルを待ち構える)


で、すっぽ抜けるので、どうしようかなーと思っていた。

なんとかなって、

結論としてはinteractで、expectで待ってくれないコマンドでもロックを効かせることができる。


下記のコマンドでOKだった。


expect -c "

spawn ssh someone@somewhere;

send \"tail -f ./some.txt\n\";

interact"



これで、ちゃんとtailが実行され続ける。


代償として、擬似的になんらかの入力を行わないと、Terminalにsshプロセスの残骸が残ったりするようだった。

アプリケーション側ではfileのcloseを入力する事でちゃんと閉じるようにしてある。



(メモ)README.mdに書くべき事

EnteringOrbit -s someone@somewhere -t ./some.txt | nnotif

で、サーバにsshで入ってsome.txtをtailした結果をMacのローカルなNotificationに放流できたりする。


これでサーバのログを見ながらコード上にエラー表示したりするのが楽になる。みたいな。


nnotif は標準入力からMacのNSDistributedNotificationを発行するやつ。


nnotif

https://github.com/sassembla/nnotif



やー やっぱりコマンドラインは柔軟だけど面倒くさいですね。あとでラップしちゃうからいいけど。